%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vim:enc=utf-8:ts=5:sw=5:et:ff=unix:fdm=marker:fdl=0:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


\section{Listar arquivos e seu tamanho} % (fold)%{{{
\label{sec:Listar arquivos e seu tamanho}

\begin{verbatim}
     # exibe no diretório atual
     ls -Ssh1
     
     # exibe arquivos maiores que 50M com seu respectivo tamanho e localização
     find -size +50M -print0 | xargs -0 ls -Ssh1
\end{verbatim}

% section Listar arquivos e seu tamanho (end)%}}}

\section{Listar arquivo mais antigo} % (fold)%{{{
\label{sec:Listar arquivo mais antigo}

\begin{verbatim}
    ls -t | tail -1
\end{verbatim}

A opção \verb|-t| do ls ativa a exibição do tamanho do arquivo, já o comando tail 
exibe por padrão os 10 ultimos resultados repassados para ele, mas neste caso está 
exibindo apenas um resultado que corresponde ao final da listagem. 

{\Large \ding{45}} Pode-se inverter 
a lógica usando a opção \verb|-r| do \verb|ls| que corresponde a uma listagem invertida.

% section Listar arquivo mais antigo (end)%}}}

\section{Limitando a taxa de download do wget} % (fold)%{{{
\label{sec:Limitando a taxa de download do wget}

O comando \verb|wget| é usado para baixar arquivos assim:
\begin{verbatim}
    wget url
\end{verbatim}

Além de seu uso simples o wget possui uma série de recursos legais, como por
exemplo limitar a taxa de downloa:

\begin{verbatim}
    wget --limit-rate=15k url
\end{verbatim}

{\Large \ding{45}} Pode-se também indicar um arquivo contendo 
uma url por linha, de modo que ele possa baixar uma lista qualquer 
de arquivos.

\begin{verbatim}
    wget -i lista.txt
\end{verbatim}

Porfim o \verb|wget| também possui uma opção que permite reiniciar os downloads
para os casos em que a conexão é quebrada ou quando falta energia.

\begin{verbatim}
    wget -c url .............................. permite continuar download
    wget -c --limit-rate=15k -i links.txt .... exemplo completo
\end{verbatim}

fazendo o download de um range de arquivos

\begin{verbatim}
for ((i=1; i<67; i++)) do 
     wget http://www.phrack.org/archives/tgz/phrack${i}.tar.gz -q 
done
\end{verbatim}

{\Large \ding{45}} A maioria das distribuições GNU/Linux disponibiliza no mesmo 
link da imagem de gravação do cd uma string de texto contendo uma checagem de integridade
da imagem para fazer esta checagem faça assim:

\begin{verbatim}
    md5sum imagem.iso
\end{verbatim}

% section Limitando a taxa de download do wget (end)%}}}

\section{Limitando a banda ao usar o apt} % (fold)%{{{
\label{sec:Limitando a banda ao usar o apt}

Em determinadas situações a sua conexão não é muito boa, você está navegando 
e ao mesmo tempo tem que instalar um determinado programa, para estes casos 
configure o apt para limitar a largura de banda usada por ele.

\begin{verbatim}
    sudo apt-get -o Acquire::http::Dl-Limit=25 install <package>
\end{verbatim}

Pode-se também configurar o arquivo \verb|/etc/apt/apt.conf|, colocando as seguintes 
linhas em seu conteúdo:
\begin{verbatim}
     //
     //
     Acquire
     {
          http {
          Dl-Limit "x";  // x Kb/sec maximum download rate
     }
      
     }
     //
     //
\end{verbatim}

{\Large \ding{45}} Pode-se ainda criar um `alias' que é um apelido para um comando
e adiciona-lo ao \verb|~/.bashrc| um arquivo oculto de confiuração do shell\footnote{
Linha de comandos do linux}.

\begin{verbatim}
    alias apt-get="apt-get -o Acquire::http::Dl-Limit=25"
\end{verbatim}

% section Limitando a banda ao usar o apt (end)% }}}

\section{Procurando pacotes no apt} % (fold)%{{{
\label{sec:Procurando pacotes no a}
\begin{verbatim}
    apt-cache search <pacote>
\end{verbatim}
% section Procurando pacotes no a (end)%}}}

\section{Gerando uma lista de todos os pacotes instalados} % (fold)%{{{
\label{sec:Gerando uma lista de todos os pacotes instalados}
\begin{verbatim}
    dpkg --get-selections > pacotes.txt
\end{verbatim}

% section Gerando uma lista de todos os pacotes instalados (end)%}}}

\section{Agendando comandos com o at} % (fold)%{{{
\label{sec:Agendando comandos com o at}

\begin{verbatim}
     echo 'comando -argumentos'| at 3:40 monday
\end{verbatim}


\begin{verbatim}
     # Agendar o download de uma distro
     echo "wget -c http://link.iso" | at 01:00 tomorrow
\end{verbatim}

\begin{verbatim}
     #exibir mensagem visual temporizada
     echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes"
\end{verbatim}

\begin{verbatim}
     # despertador com mpg123
     at 6:00 <<< "mpg123 ~/docs/musicas/u2/Boy/*.mp3"
\end{verbatim}
% section Agendando comandos com o a (end)%}}}

\section{Here documents} % (fold)%{{{
\label{sec:Here documents}

A tradução literal significa ``documento aqui'' é uma técnica que é 
muito usada na construção de scripts nos quais se temque digitar grandes
quantidades de texto e não se quer usar variáveis tipo string:

\begin{verbatim}
    cat <<-EOT
    um texto muito longo
    com varias linhas 
    vai ser colocado aqui
    e ao encontrar o texto a 
    seguir o here documment termina aqui
    EOT
\end{verbatim}

Outro exemplo de here documents em que estamos adicionando 
um conteudo ao final de um arquivo dos sistema (como root)
\begin{verbatim}
     cat <<-EOF >> /etc/profile
      
     http_proxy="http://${PROXY}"
     ftp_proxy="http://${PROXY}"
     export http_proxy ftp_proxy
     EOF
\end{verbatim}

% section Here documents (end)%}}}

\section{Criando sequencias} % (fold)%{{{
\label{sec:Criando sequencias}

\begin{verbatim}
    seq 10
\end{verbatim}

uma sequencia com zeros à esquerda
\begin{verbatim}
     seq -w 100
\end{verbatim}
% section Criando sequencias (end)%}}}

\section{Somando os números de 1 a 100} % (fold)%{{{
\label{sec:Somando os números de 1 a 100}
\begin{verbatim}
    seq -s+ 100 | bc
\end{verbatim}

o comando \verb|seq| gera sequências com separador padrão quebra de linha \verb|\n|
mas a opção \verb|-s| do comando permite alterar o mesmo, no caso acima para sinal de mais
e o resultado e enviado via pipe para o comando \verb|bc| que é uma calculadora.

% section Somando os números de 1 a 100 (end)%}}}

\section{Somando valores com o paste e o bc} % (fold)%{{{
\label{sec:Somando valores com o paste e o b}

Fonte: \url{http://br.groups.yahoo.com/group/shell-script} - Mensagem 19183
arquivo valores.txt contem

\begin{verbatim}
     #cat valores.txt
     23
     21
     90
     32
\end{verbatim}

o comando deve me retornar a soma de todos estes numeros, alguem pode
me dar um help?
\begin{verbatim}
     $ paste -sd+ valores.txt | bc
     166
\end{verbatim}

A opção -s transforma coluna em linha, a opçao -d indica o
delimitador e bc é uma calculadora. Veja só o paste:
\begin{verbatim}
     $ paste -sd+ valores.txt
     23+21+90+32
\end{verbatim}

% section Somando valores com o paste e o b (end)%}}}

\section{Recuperando a senha de root facilmente} % (fold)%{{{
\label{sec:Recuperando a senha de root facilmente}

Carregue um lice-cd qualquer e monte a partição raiz do sistema
que está instalado no hd:

\begin{verbatim}
     mount /dev/hda1 /mnt/linux
\end{verbatim}

Neste caso consideramos que a partiação raiz é \verb|/dev/hda1|.

agora dê um chroot no diretório montado

\begin{verbatim}
     chroot /mnt/linux
\end{verbatim}

finalmente mude a senha de root

\begin{verbatim}
     passwd
\end{verbatim}

Reinicie seu sistema
\begin{verbatim}
     shutdown -r 0
\end{verbatim}
% section Recuperando a senha de root facilmente (end)%}}}

\section{Comparando arquivos com o comando comm} % (fold)%{{{
\label{sec:Comparando arquivos com o comando comm}

\begin{verbatim}
     # Interseção de arquivos
     comm -12 <(sort file1) <(sort file2)
     # subtraction of file1 from file2
     comm -13 <(sort file1) <(sort file2)
\end{verbatim}

% section Comparando arquivos com o comando comm (end)%}}}

\section{Criando backups de arquivos de configuração} % (fold)%{{{
\label{sec:Criando backups de arquivos de configuração}

Nos manuais encontrados na web encontra-se muitas dicas do tipo:
\begin{verbatim}
    Faça um backup antes de editar o sources.list
    cp /etc/apt/sources.list /etc/apt/sources.list.backup
\end{verbatim}

Mas você pode digitar bem menos caracteres fazendo assim:

\begin{verbatim}
    cp /etc/apt/sources.list{,.backup}
\end{verbatim}

% section Criando backups de arquivos de configuração (end)%}}}

\section{Exibindo a data no padrão americano} % (fold)%{{{
\label{sec:Exibindo a data no padrão americano}

O padrão americando exibe data no formato ano-mes-dia, isto 
facilita a análise pois quando você procura dados o ano no primeiro 
campo é melhor.

\begin{verbatim}
    date -I
\end{verbatim}

Criando uma pasta usando o comando acima
\begin{verbatim}
     # criando uma pasta com data
     mkdir $(date +%d-%m-%Y)
\end{verbatim}

% section Exibindo a data no padrão americano (end)%}}}

\section{Gerando uma imagem iso de um cd} % (fold)%{{{
\label{sec:Gerando uma imagem iso de um cd}
\begin{verbatim}
    dd if=/dev/cdrom of=imagem.iso
\end{verbatim}
% section Gerando uma imagem iso de um cd (end)%}}}

\section{Obtendo o endereço do gateway} % (fold)%{{{
\label{sec:Obtendo o endereço do gateway}

Quando configuramos a rede temos que saber o endereço do gateway, você busca
esta informação em uma máquina já conectada usando este comando

\begin{verbatim}
    route -n | awk '/UG/ {print $2}'
\end{verbatim}

% section Obtendo o endereço do gateway (end)%}}}

\section{Liberando dispositivos} % (fold)%{{{
\label{sec:Liberando dispositivos}

Quando você tenta desmontar um cdrom e o sistema indica que 
o dispositivo está ocupado pode-se usar o seguinte comando

\begin{verbatim}
    fuser -mkv /media/cdrom0
\end{verbatim}

% section Liberando dispositivos (end)%}}}

\section{Matando processos graficamente} % (fold)%{{{
\label{sec:Matando processos graficamente}

Um comando bastante útil para matar processos pelo nome é o comando \verb|pkill| 
ele é uma combinação do \verb|grep| que é um filtro e o comando \verb|kill| que mata 
processos, ou seja, fornecendo um nome ao pkill ele procura todos os processos que 
contém aquele nome e mata, exemplo:
\begin{verbatim}
    pkill firefox
\end{verbatim}

% section Matando processos graficamente (end)%}}}

\section{Testando um range de ips} % (fold)%{{{
\label{sec:Testando um range de ips}
O nmap é uma ferramenta de administração de rede que tem muitas opções, 
abaixo um comando que testa em uma faixa de ips quais as máquinas respondem 
ao um ping, ou seja, quais as máquinas ativas nesta faixa.
\begin{verbatim}
    nmap -sP 10.3.0.1-254
\end{verbatim}

{\Large \ding{45}} Combinando com o \verb|awk|:
\begin{verbatim}
    nmap -sP 192.168.0.1-254 | awk '/^Host/ {print $2 " ativo"}'
\end{verbatim}

% section Testando um range de ips (end)%}}}

\section{Transformas tres linhas em uma} % (fold)%{{{
\label{sec:Transformas tres linhas em u}

Você tem este conteúdo em file
\begin{verbatim}
     2,5,1,1
     3
     5
     3,7,1,1
     2
     8
\end{verbatim}

Para obter este resultado
\begin{verbatim}
     2,5,1,1,3,5
     3,7,1,1,2,8
\end{verbatim}

use este comando
\begin{verbatim}
     paste -d"," - - - < file
\end{verbatim}


% section Transformas tres linhas em uma (end)%}}}

\section{Altearando a extensão de arquivos} % (fold)%{{{
\label{sec:Altearando a extensão de arquivos}
\begin{verbatim}
      rename 's/\.html$/.htm/' *.html
\end{verbatim}
% section Altearando a extensão de arquivos (end)%}}}

\section{Backup com rsync} % (fold)%{{{
\label{sec:Backup com rsync}

{\Large \ding{45}} Caso usemos barra após o nome de uma pasta no \verb|rsync|
ele pega só o conteúdo

\begin{verbatim}
    rsync -avz ./fulano/ fulano@172.30.34.10:/home/backup-fulano
\end{verbatim}

O rsync tem outras opções interessantes:
\begin{verbatim}
    --update ......... se o arquivo copiado for mais novo 
    --delete ......... se a origem tiver sido deletada
    --iconv=utf8,iso88591 ... conserta codificação 
\end{verbatim}
% section Backup com rsync (end)%}}}

\section{Deletando linha com determinado padrão} % (fold)%{{{
\label{sec:Deletando linha com determinado padrão}
\begin{verbatim}
    sed -i.backup '/padrao/d' arquivo.original
\end{verbatim}

deletando uma linha específica
\begin{verbatim}
    sed -i 8d ~/.ssh/known_hosts
\end{verbatim}

\section{Substituindo em linhas que contém determinado padrão} % (fold)
\label{sec:Substituindo em linhas que contém determinado padrão}
\begin{verbatim}
    sed -i '/^padrao/ s/^/#/g' file
\end{verbatim}

Desabilitando terminais 
\begin{verbatim}
    sed -i.backup '6,7s/^start/stop/g' /etc/event.d/tty[3-6]
\end{verbatim}

Removendo terminador de linha do DOS
\begin{verbatim}
    sed -i 's/%0d//g' arquivo
\end{verbatim}
% section Substituindo em linhas que contém determinado padrão(end)
% section Deletando linha com determinado padrão (end)%}}}
